package com.itheima.leetcode.od.b.bf;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;

/**
 * (C卷,100分)- 最长的指定瑕疵度的元音子串（Java & JS & Python & C）
 * <p>
 * 题目描述
 * <p>
 * 开头和结尾都是元音字母（aeiouAEIOU）的字符串为元音字符串，其中混杂的非元音字母数量为其瑕疵度。比如:
 * <p>
 * “a” 、 “aa”是元音字符串，其瑕疵度都为0
 * “aiur”不是元音字符串（结尾不是元音字符）
 * “abira”是元音字符串，其瑕疵度为2
 * 给定一个字符串，请找出指定瑕疵度的最长元音字符子串，并输出其长度，如果找不到满足条件的元音字符子串，输出0。
 * <p>
 * 子串：字符串中任意个连续的字符组成的子序列称为该字符串的子串。
 * <p>
 * 输入描述
 * <p>
 * 首行输入是一个整数，表示预期的瑕疵度flaw，取值范围[0, 65535]。
 * <p>
 * 接下来一行是一个仅由字符a-z和A-Z组成的字符串，字符串长度(0, 65535]。
 * <p>
 * 输出描述
 * <p>
 * 输出为一个整数，代表指定瑕疵度的最长元音字符子串的长度。
 * <p>
 * 用例
 * <p>
 * 输入	0
 * asdbuiodevauufgh
 * 输出	3
 * 说明	无
 * 输入	2
 * aeueo
 * 输出	0
 * 说明	无
 */
public class LongestVowelSubstringWithSpecifiedDefectDegree {
    public static void main(String[] args) {
        /*// 处理输入
        Scanner in = new Scanner(System.in);
        int flaw = Integer.parseInt(in.nextLine());
        String input = in.nextLine();*/

        System.out.println(getResult(0, "asdbuiodevauufgh"));
    }

    public static int getResult(int flaw, String s) {
        HashSet<Character> set = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'));

        ArrayList<Integer> idxs = new ArrayList<>();
        for (int i = 0; i < s.length(); i++) {
            if (set.contains(s.charAt(i))) {
                idxs.add(i);
            }
        }

        int ans = 0;
        int n = idxs.size();

        int l = 0;
        int r = 0;

        while (r < n) {
            // 瑕疵度计算
            int diff = (idxs.get(r) - idxs.get(l) + 1) - (r - l + 1); // idxs设计的精妙之处，看图瞬间就懂了

            if (flaw < diff) {
                l++;
            } else if (diff < flaw) {
                r++;
            } else {
                ans = Math.max(ans, idxs.get(r) - idxs.get(l) + 1);
                r++;
            }
        }

        return ans;
    }
}
